package db;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;

/**
 * 쿼리 설정을 담당하는 클래스 </p>
 * query.properties 파일에 있는 쿼리를 읽어오는 클래스
 * @author (주)열음소프트
 * @version 1.0
 */

public class QueryManager
{
  /**
   * QueryManager 인스탄스
   */
  private static QueryManager instances = null;

  /**
   *  프로퍼티 파일의 디렉토리 위치
   */
  private static String strWorkDir = "";



  /**
   * query.properties 파일을 로드할 File객체
   */
  public static java.io.File fileQuery = null;

  /**
   * query 프로퍼티 파일명
   */
  private static final String strQueryFileNm = "query.properties";

  /**
   * query 프로퍼티 의 최종수정정보
   */
  public static long lLastQueryModify = 0;

  /**
   * query 프로퍼티
   */
  private static Properties propsQuery = null;




  static {

 
//    strWorkDir = "/web/etc/etc/WEB-INF";
//	strWorkDir =  System.getProperty("catalina.home")+"\\webapps\\etc\\WEB-INF\\";
//	  strWorkDir = "/DEV/workspace/etc/WebRoot/WEB-INF";

 //   fileQuery = new File(strWorkDir, strQueryFileNm);
  }
  public static void initQueryFile(String workDir){
	  strWorkDir = workDir;
	  fileQuery = new File(strWorkDir, strQueryFileNm);
  }
  public static QueryManager getInstance() throws ConfigException {
    // query
    if (fileQuery.isFile()) {
      if (instances == null || lLastQueryModify != fileQuery.lastModified() ||
          propsQuery == null) {
        instances = new QueryManager();
      }
    }
    else {
      throw new ConfigException(strWorkDir + strQueryFileNm + " do not exist ");
    }

    return instances;
  }

  /**
   *
   * query.properties 에 설정된 String 값을 리턴한다.
   *
   * @param  strKey     String
   * @return String
   * @throws ConfigException
   *
   */
  public String getQueryString(String strKey) throws ConfigException {
    String strQueryValue = null;
    try {
      strQueryValue = propsQuery.getProperty(strKey);
      if (strQueryValue == null) {
        throw new ConfigException("value of key(" + strKey + ") is null");
      }
    }
    catch (Exception ex) {
    	ex.printStackTrace();
      throw new ConfigException("Illegal String Key : " + strKey);
    }
    return strQueryValue;
  }


  /**
   *
   * query.properties 프로퍼티에 파일의 수정된 값을 long 타입으로 리턴한다.
   *
   * @return long
   *
   */
  public long getLastQueryModified() {
    return lLastQueryModify;
  }


  /**
   *
   * query.properties 파일객체를 리턴한다
   *
   * @return File
   *
   */
  public File getQueryFile() {
    return fileQuery;
  }

  /**
   *
   * 프로퍼티 파일을 로드하고, 파일의 수정시간을 저장한다.
   *
   * @throws ConfigException
   *
   */
  private void configLoad() throws ConfigException {
    try {
      // query.properties 파일 로드
      propsQuery = new Properties();
      BufferedInputStream queryBuffer = new BufferedInputStream(new
          FileInputStream(fileQuery));
      propsQuery.load(queryBuffer);
      queryBuffer.close();
      lLastQueryModify = fileQuery.lastModified();
    }
    catch (Exception ex) {
      ex.printStackTrace();
      throw new ConfigException(this.getClass().getName() +
                                " - Can't load query file: " + ex.getMessage());
    }

  }

  /**
   *
   * private 디폴트 생성자로서 프로퍼티를 로드한다.
   *
   * @throws ConfigException
   *
   */
  private QueryManager() throws ConfigException {
    try {
      configLoad();
    }
    catch (ConfigException configEx) {
      throw configEx;
    }
    catch (Exception ex) {
      throw new ConfigException(ex.getMessage());
    }
  }

  
  /**
   * query.properties 에서 해당 쿼리 가져옴
   * @return 주소값
   */
  public static String getQuery(String sqlkey)          // 문자형의 getQuery라는 메서드 선언.
  {
      String query = "";                         // 문자형 변수 query에 ""값 넣음.

      try
      {
          query = QueryManager.getInstance().getQueryString(sqlkey).trim();  // query에 ........?;;;
      }
      catch(Exception ex) { ex.printStackTrace(); }

      return query;                               // query를 돌려줌.
  }
}
